package com.seckill.service;

import java.util.List;

import com.seckill.dto.Exposer;
import com.seckill.dto.SeckillExecution;
import com.seckill.entity.Seckill;
import com.seckill.exception.RepeatKillException;
import com.seckill.exception.SeckillCloseException;
import com.seckill.exception.SeckillException;

/**
 * 接口定义 站在“使用者”的角度上 注意接口方法三个方面：粒度、参数、返回类型
 */
public interface SeckillService {

	/**
	 * 查询所有秒杀列表
	 * 
	 * @return
	 */
	public List<Seckill> getSeckillList(int offset, int limit);

	/**
	 * 查询单个秒杀
	 * 
	 * @return
	 */
	public Seckill getById(Long seckillId);

	/**
	 * 秒杀开启时输出秒杀接口地址， 否则输出系统时间和秒杀开启时间
	 * 
	 * @param seckillId
	 */
	public Exposer exportSeckillUrl(Long seckillId);

	/**
	 * 执行秒杀操作
	 * 
	 * @param seckillId
	 * @param userPhone
	 * @param md5
	 */
	public SeckillExecution executeSeckill(Long seckillId, Long userPhone, String md5)
			throws SeckillException, SeckillCloseException, RepeatKillException;

	public SeckillExecution executeSeckillProcedure(Long seckillId, Long userPhone, String md5);
}
